package com.example.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTCreationException;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.example.pojo.User;

import java.util.Date;

/**
 * Token工具类，用于生成和验证Token
 */
public class TokenUtils {

    // Token到期时间设定为10小时
    private static final long EXPIRE_TIME = 10 * 60 * 60 * 1000;
    // 密钥盐，用于加密Token
    private static final String TOKEN_SECRET = "ljdyaishijin**3nkjnj??";

    /**
     * 生成Token
     *
     * @param user 用户信息，用于生成Token中的载荷
     * @return 生成的Token字符串，如果生成失败则返回null
     */
    public static String sign(User user) {
        String token = null;
        try {
            Date expireAt = new Date(System.currentTimeMillis() + EXPIRE_TIME);
            token = JWT.create()
                    // 设置发行人
                    .withIssuer("auth0")
                    // 存放用户信息
                    .withClaim("username", user.getUsername())
                    .withClaim("id", user.getId())
                    // 设置Token过期时间
                    .withExpiresAt(expireAt)
                    // 使用密钥盐加密Token
                    .sign(Algorithm.HMAC256(TOKEN_SECRET));
        } catch (IllegalArgumentException | JWTCreationException je) {
            // 异常处理：如果Token创建失败
        }
        return token;
    }

    /**
     * Token验证
     *
     * @param token 待验证的Token字符串
     * @return 验证结果，true为通过，false为不通过
     */
    public static Boolean verify(String token) {
        try {
            // 创建Token验证器
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(TOKEN_SECRET)).withIssuer("auth0").build();
            DecodedJWT decodedJWT = jwtVerifier.verify(token);
            System.out.println("认证通过：");
            System.out.println("username: " + decodedJWT.getClaim("username").asString());
            System.out.println("过期时间：      " + decodedJWT.getExpiresAt());
        } catch (IllegalArgumentException | JWTVerificationException e) {
            // 抛出错误即为验证不通过
            return false;
        }
        return true;
    }

    /**
     * 从Token中获取用户信息
     *
     * @param token 包含用户信息的Token字符串
     * @return 如果Token有效，返回用户对象；如果Token无效，返回null
     */
    public static User getUserFromToken(String token) {
        try {
            // 创建Token验证器
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(TOKEN_SECRET))
                    .withIssuer("auth0")
                    .build();
            // 解码Token
            DecodedJWT decodedJWT = jwtVerifier.verify(token);

            // 获取Token中的用户信息
            String username = decodedJWT.getClaim("username").asString();
            String id = decodedJWT.getClaim("id").asString();

            // 构建并返回用户对象
            User user = new User();
            user.setUsername(username);
            user.setId(id);

            return user;
        } catch (Exception e) {
            // 如果Token无效，返回null
            return null;
        }
    }
}
